package top.kaoshanji.p3ch26b;

import java.util.Random;
import java.util.concurrent.*;

/**
 * 代码清单-p3ch26b-659页a：基本的任务执行服务
 * author kaoshanji
 * ^_^
 * create time 2025/3/4 18:09
 */
public class BasicFutureDemo {

    public static void main(String[] args) {

        master();

    }

    // 异步执行服务
    private static ExecutorService executor = Executors.newFixedThreadPool(10);

    private static Random rnd = new Random();

    // 模拟延时
    static int delayRandom(int min, int max) {
        int milli = max > min ? rnd.nextInt(max - min) : 0;
        try {
            Thread.sleep(min + milli);
        } catch (InterruptedException e) {
            /// ///
        }
        return milli;
    }

    // 表示外部任务
    static Callable<Integer> externalTask = () -> {
        return delayRandom(20, 2000);
    };

    // 通过任务执行服务调用外部服务，一般返回 Future，表示异步结果
    public static Future<Integer> callExternalService() {
        return executor.submit(externalTask);
    }

    // 代码清单-p3ch26b-661页a：使用 FutureTask 调用外部服务
    public static Future<Integer> callExternalService2() {
        FutureTask<Integer> future = new FutureTask<>(externalTask);
        new Thread() {
            @Override
            public void run() {
                future.run();
            }
        }.start();
        return future;
    }



    // 在主程序中，结合异步任务和本地调用
    public static void master() {
        // 执行异步任务
        Future<Integer> asyncRet = callExternalService();

        // 执行其他任务...

        // 获取异步任务的结果，处理可能的异常
        try {
            Integer ret = asyncRet.get();
            System.out.println(ret);
        } catch (ExecutionException | InterruptedException e) {
            throw new RuntimeException(e);
        }


    }



}
